package concurrency.basicthreading.demo;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * 当我们使用Executor创建线程时。如何设定线程的属性(后台线程，优先级，名称)?
 *  答案是: 我们可以实现ThreadFactory接口.并在newThread()方法中指定线程的属性(后台线程，优先级，名称)。
 *  			然后将实现ThreadFactory接口类的对象作为参数传递给Executors.newCachedThreadPool(). 这个对象将被用来创建新的线程。
 *
 */


public class Demo08ThreadFactory implements ThreadFactory{
	
	@Override
	public Thread newThread(Runnable r) {
		Thread thread =  new Thread(r);
		//thread.setDaemon(true);
		return thread;
	}
	
	public static void main(String[] args) {
		//Demo08ThreadFactory对象将被用来创建新的线程。
		ExecutorService exec = Executors.newCachedThreadPool(new Demo08ThreadFactory());
		
		try {
			for (int i = 0; i < 20; i++) {
				exec.execute(new Demo01Runnable());
			}
			//shutdown方法用于防止新的任务被提交到Executor(线程池)，当shutdown方法调用之后，shutdown方法调用之前提交的所有任务将继续执行。
			exec.shutdown();

			TimeUnit.MILLISECONDS.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
